/*
 * @Description: 层级组件上下文
 * @Author: Rfan
 * @Date: 2022-06-21 10:25:48
 * @LastEditTime: 2022-06-21 20:20:52
 */

import { createContext, useContext, useReducer } from 'react';
import {
  INIT_INFO,
  SET_CHANGE_METHOD,
  SET_COMPUTE_HEIGHT_SWITCH,
  SET_LIST_HEIGHT,
  SET_SELECTED_ITEM
} from '../constants';
import { LevelTableReducer } from '../reducers/LevelTableReducer';

const initialState = {
  // 当前档案类型ID
  currentAt: 0,
  // 本层级相关信息
  baseInfo: [],
  // 上级条目信息
  upperInfo: {},
  // 上级可展示条目信息
  upperFields: [],
  // 选中条目向外数据方法
  selectChange: null,
  // 选中的表格条目
  selectItems: [],
  // 是否计算表格高度，显示滚动条
  isComputeHeight: false,
  // 要设置的表单高度
  tableHeight: 0,
  //  组件列表title映射
  eRecordTitle: {
    file_path: '文件路径',
    file_url: '文件url',
    file_ext: '文件扩展名',
    file_name: '文件名',
    file_size: '文件大小'
  }
};

const LevelTableContext = createContext();

const LevelTableContextProvider = (props) => {
  const [state, dispatch] = useReducer(LevelTableReducer, initialState);

  const actions = {
    /**
     * @description: 表格选中的项目
     * @param {*} selectArr 选中的项目
     */
    setSelectedItem(selectArr) {
      dispatch({ type: SET_SELECTED_ITEM, data: selectArr });
    },

    /**
     * @description: 初始化接收的坐标及上级条目信息
     * @param {*} data 组件接收到的数据
     */
    initInfo(data) {
      dispatch({ type: INIT_INFO, ...data });
    },

    /**
     * @description: 选中条目向外数据方法
     * @param {*} func 函数本体
     * @return {*}
     */
    setChangeMethod(func) {
      dispatch({ type: SET_CHANGE_METHOD, data: func });
    },

    /**
     * @description: 设置是否计算高度开关
     * @param {boolean} data
     */
    setComputeHeightMethod(data) {
      dispatch({ type: SET_COMPUTE_HEIGHT_SWITCH, data });
    },

    /**
     * @description: 设置表格高度
     * @param {number} height 计算后的表格高度
     */
    setListHeight(height) {
      dispatch({ type: SET_LIST_HEIGHT, data: height });
    }
  };

  return (
    <LevelTableContext.Provider value={{ ...state, ...actions }}>
      {props.children}
    </LevelTableContext.Provider>
  );
};

export const useLevelTableContext = () => {
  return useContext(LevelTableContext);
};

export { LevelTableContext, LevelTableContextProvider };
